/*8
 * 
 * 验证IP地址
 * 
 * 描述

编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址

IPv4 地址由十进制数和点来表示，每个地址包含4个十进制数，其范围为 0 - 255， 用(".")分割。比如，172.16.254.1；
同时，IPv4 地址内的数不会以 0 开头。比如，地址 172.16.254.01 是不合法的。

IPv6 地址由8组16进制的数字来表示，每组表示 16 比特。这些组数字通过 (":")分割。比如,  2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且，我们可以加入一些以 0 开头的数字，字母可以使用大写，也可以是小写。所以， 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即，忽略 0 开头，忽略大小写)。

然而，我们不能因为某个组的值为 0，而使用一个空的组，以至于出现 (::) 的情况。 比如， 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。
同时，在 IPv6 地址中，多余的 0 也是不被允许的。比如， 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。

说明: 你可以认为给定的字符串里没有空格或者其他特殊字符。

数据范围：字符串长度满足 
5
≤
n
≤
50
5≤n≤50
进阶：空间复杂度 
O
(
n
)
O(n)，时间复杂度 
O
(
n
)
O(n)
 */
public class 验证IP地址 {
    
    public static void main(String[] args) {
        
    }

    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 验证IP地址
     * @param IP string字符串 一个IP地址字符串
     * @return string字符串
     */
    public static String solve (String IP) {
        // write code here

        try{
            //含有"."的，判断是否是IPv4地址
            if(IP.indexOf(".")>0){
                //通过"."进行分割
                String[] strs=IP.split("\\.");
                //如果不是4组，返回"Neither"
                if(strs.length!=4) throw new Exception("Neither");
                //遍历每一组
                for(int i=0;i<strs.length;i++){
                    int num=Integer.parseInt(strs[i]);
                    //如果大于255，或者第一位是0，而长度不止一位的，返回"Neither"
                    if(num>255||(strs[i].charAt(0)=='0'&&strs[i].length()>1)){
                        throw new Exception("Neither");
                    }              
                }
                return "IPv4";
            }
            //含有":"的，判断是否是IPv6地址
            else if(IP.indexOf(":")>0){
                //如果以":"开头，或者以":"结尾，返回"Neither"
                if(IP.charAt(0)==':'||IP.charAt(IP.length()-1)==':'){
                    throw new Exception("Neither");
                }
                //通过":"进行分割
                String[] strs=IP.split(":");
                //如果不是8组，返回"Neither"
                if(strs.length!=8) throw new Exception("Neither");
                //遍历每一组
                for(int i=0;i<strs.length;i++){
                    //如果某一组为空，或者长度大于4的，返回"Neither"
                    if(strs[i].equals("")||strs[i].length()>4) throw new Exception("Neither");
                    int num=Integer.parseInt(strs[i],16);
                }
                return "IPv6";
            }
            else{
                throw new Exception("Neither");
            }
        }
         
        //格式不正确，返回"Neither"
        catch(Exception e){
            return "Neither";
        }
    }
}
